# To run clang-tidy from CMake, build ClickHouse with -DENABLE_CLANG_TIDY=1. To show all warnings, it is
# recommended to pass "-k0" to Ninja.

# Enable all checks + disable selected checks. Feel free to remove disabled checks from below list if
# a) the new check is not controversial (this includes many checks in readability-* and google-*) or
# b) too noisy (checks with > 100 new warnings are considered noisy, this includes e.g. cppcoreguidelines-*).

HeaderFilterRegex: '^.*/(base|src|programs|utils)/.*(h|hpp)$'

Checks: [
  '*',

  '-abseil-*',

  '-altera-*',

  '-android-*',

  '-bugprone-assignment-in-if-condition',
  '-bugprone-branch-clone',
  '-bugprone-easily-swappable-parameters',
  '-bugprone-exception-escape',
  '-bugprone-forward-declaration-namespace',
  '-bugprone-implicit-widening-of-multiplication-result',
  '-bugprone-narrowing-conversions',
  '-bugprone-not-null-terminated-result',
  '-bugprone-reserved-identifier', # useful but too slow, TODO retry when https://reviews.llvm.org/rG1c282052624f9d0bd273bde0b47b30c96699c6c7 is merged
  '-bugprone-unchecked-optional-access',

  '-cert-dcl16-c',
  '-cert-dcl37-c',
  '-cert-dcl51-cpp',
  '-cert-err58-cpp',
  '-cert-msc32-c',
  '-cert-msc51-cpp',
  '-cert-oop54-cpp',
  '-cert-oop57-cpp',

  '-clang-analyzer-optin.performance.Padding',

  '-clang-analyzer-unix.Malloc',

  '-cppcoreguidelines-*', # impractical in a codebase as large as ClickHouse, also slow

  '-darwin-*',

  '-fuchsia-*',

  '-google-build-using-namespace',
  '-google-readability-braces-around-statements',
  '-google-readability-casting',
  '-google-readability-function-size',
  '-google-readability-namespace-comments',
  '-google-readability-todo',

  '-hicpp-avoid-c-arrays',
  '-hicpp-avoid-goto',
  '-hicpp-braces-around-statements',
  '-hicpp-explicit-conversions',
  '-hicpp-function-size',
  '-hicpp-member-init',
  '-hicpp-move-const-arg',
  '-hicpp-multiway-paths-covered',
  '-hicpp-named-parameter',
  '-hicpp-no-array-decay',
  '-hicpp-no-assembler',
  '-hicpp-no-malloc',
  '-hicpp-signed-bitwise',
  '-hicpp-special-member-functions',
  '-hicpp-uppercase-literal-suffix',
  '-hicpp-use-auto',
  '-hicpp-use-emplace',
  '-hicpp-vararg',

  '-linuxkernel-*',

  '-llvm-*',

  '-llvmlibc-*',

  '-openmp-*',

  '-misc-const-correctness',
  '-misc-include-cleaner', # useful but far too many occurrences
  '-misc-no-recursion',
  '-misc-non-private-member-variables-in-classes',
  '-misc-confusable-identifiers', # useful but slooo
  '-misc-use-anonymous-namespace',

  '-modernize-avoid-c-arrays',
  '-modernize-concat-nested-namespaces',
  '-modernize-macro-to-enum',
  '-modernize-pass-by-value',
  '-modernize-return-braced-init-list',
  '-modernize-use-auto',
  '-modernize-use-default-member-init',
  '-modernize-use-emplace',
  '-modernize-use-nodiscard',
  '-modernize-use-trailing-return-type',

  '-performance-inefficient-string-concatenation',
  '-performance-no-int-to-ptr',
  '-performance-avoid-endl',
  '-performance-unnecessary-value-param',

  '-portability-simd-intrinsics',

  '-readability-avoid-unconditional-preprocessor-if',
  '-readability-braces-around-statements',
  '-readability-convert-member-functions-to-static',
  '-readability-else-after-return',
  '-readability-function-cognitive-complexity',
  '-readability-function-size',
  '-readability-identifier-length',
  '-readability-identifier-naming', # useful but too slow
  '-readability-implicit-bool-conversion',
  '-readability-isolate-declaration',
  '-readability-magic-numbers',
  '-readability-named-parameter',
  '-readability-redundant-declaration',
  '-readability-simplify-boolean-expr',
  '-readability-suspicious-call-argument',
  '-readability-uppercase-literal-suffix',
  '-readability-use-anyofallof',

  '-zircon-*'
]

WarningsAsErrors: '*'

ExtraArgs:
# clang-tidy 17 started to complain (for unknown reasons) that various pragmas are unknown ("clang-diagnostic-unknown-pragmas").
# This is technically a compiler error, not a clang-tidy error. We could litter the code base with more pragmas that suppress
# this error but it is better to pass the following flag to the compiler:
- '-Wno-unknown-pragmas'
- '-Wno-unused-command-line-argument' # similar issue

CheckOptions:
  readability-identifier-naming.ClassCase: CamelCase
  readability-identifier-naming.EnumCase: CamelCase
  readability-identifier-naming.LocalVariableCase: lower_case
  readability-identifier-naming.StaticConstantCase: aNy_CasE
  readability-identifier-naming.MemberCase: lower_case
  readability-identifier-naming.PrivateMemberPrefix: ''
  readability-identifier-naming.ProtectedMemberPrefix: ''
  readability-identifier-naming.PublicMemberCase: lower_case
  readability-identifier-naming.MethodCase: camelBack
  readability-identifier-naming.PrivateMethodPrefix: ''
  readability-identifier-naming.ProtectedMethodPrefix: ''
  readability-identifier-naming.ParameterPackCase: lower_case
  readability-identifier-naming.StructCase: CamelCase
  readability-identifier-naming.TemplateTemplateParameterCase: CamelCase
  readability-identifier-naming.TemplateParameterCase: lower_case
  readability-identifier-naming.TypeTemplateParameterCase: CamelCase
  readability-identifier-naming.TypedefCase: CamelCase
  readability-identifier-naming.UnionCase: CamelCase
  modernize-loop-convert.UseCxx20ReverseRanges: false
  performance-move-const-arg.CheckTriviallyCopyableMove: false
  # Workaround clang-tidy bug: https://github.com/llvm/llvm-project/issues/46097
  readability-identifier-naming.TypeTemplateParameterIgnoredRegexp: expr-type
  cppcoreguidelines-avoid-do-while.IgnoreMacros: true
